#include <iostream>

using namespace std;

//普通函数与函数模板区别：
//1、普通函数调用时可以发生自动类型转换（隐式类型转换）
//2、函数模板调用时，如果利用自动类型推导，不会发生隐式类型转换
//3、如果利用显示指定类型的方式，可以发生隐式类型转换

//建议使用显示指定类型的方式，调用函数模板，因为可以自己确定通用类型T

//普通函数
int myAdd1(int a, int b) {
    return a + b;
}

//函数模板
template<typename T>
T myAdd2(T a, T b) {
    return a + b;
}

void test() {
    int a = 10;
    int b = 20;
    char c = 'c';
    //普通函数
    cout << myAdd1(a, b) << endl;
    cout << myAdd1(a, c) << endl;//正确，将char类型的'c'隐式转换为int类型  'c' 对应 ASCII码 99
    //自动类型推导
    cout << myAdd2(a, b) << endl;
    //cout<<myAdd2(a,c)<<endl;// 报错，使用自动类型推导时，不会发生隐式类型转换
    //显示指定类型
    cout << myAdd2<int>(a, b) << endl;
    cout << myAdd2<int>(a, c) << endl;//正确，如果用显示指定类型，可以发生隐式类型转换
}

int main() {
    test();
    return 0;
}